Cheapest Flights Within K Stops
#JuneLeetCodeChallenge #level3
2020/6/14
LeetCode.icon問題
問題概要
https://gyazo.com/3dfcbc859b6a01487c37b076b63901df
N数の街とそれらをつなぐフライト航路が与えられる
航路には、それぞれ出発地・到着地・料金がある
ある出発地から到着地までで、k数のステップで最小となる金額を求めよ、という問題
解法
グラフの探索なのでBFS or DFSで解けそうと踏んだ
どちらでも良いが今回はBFS
queueを使って走査していき、queueが空もしくはkの上限に達したら終了
終了した時点で最小の金額になってる値を返せばok
時間計算量
$ O(N \times K)
最悪計算量としては、最大深さK(正確にはK-1)においてそれぞれノード数Nを探索する必要があるため.
空間計算量
$ O(N^2 + N \times K)
map部分でフライト情報を格納していて、これに$ O(N^2)かかる
queue部分でKステップまで格納し続けるので最悪計算量としては$ O(N \times K)になる
解くのにかかった時間
合計32分
方針に2分
実装等に30分
うちデバッグに(恐らく)15分くらい?
参照周りを雑に書いたらバグったので、確実に参照使ってokそうなflight周りに絞り、
かつ値段周りで枝切りしたらTLEも発生せず無事通った
Cheapest Flights Within K Stops#5ee71b45c3422c0000049e26
ベルマンフォード法, ダイクストラ法でもそれぞれ解けるようなので、以下にまとめる予定.
Cheapest Flights Within K Stops_ベルマンフォード法
Cheapest Flights Within K Stops_ダイクストラ法
code:solution.cpp
class Solution {
public:
int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K) {
map<int, vector<vector<int>>> m;
for (vector<int>& f : flights) {
if (m.count(f0)) m[f0].push_back({f1, f2});
else m[f0] = {{f1, f2}};
}
int price = INT_MAX;
queue<vector<int>> q;
if (!m.count(src)) return -1;
for (vector<int> v : msrc) q.push({v0, v1, 0});
while (!q.empty() && q.front()2 <= K) {
vector<int> p = q.front();
q.pop();
// pruning redundant processing
if (price < p1) continue;
// arrived at dst
if (p0 == dst) price = min(price, p1);
// cannot visit anymore
if (!m.count(p0)) continue;
for (vector<int> v : m[p0]) q.push({v0, p1 + v1, p2+1});
}
if (price == INT_MAX) price = -1;
return price;
}
};